#include<vector>
#include<iostream>
#include<cmath>
using namespace std;

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode() : val(0), left(nullptr), right(nullptr) {}
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};


class Solution {
public:
    vector<string> path;

    char get_word(int num) {
        return 'a' + num;
    }

    void dfs(TreeNode* root, string cur){
        if (!root) return;

        if (!root->left && !root->right) {
            path.push_back(cur);
            return;
        }

        if (root->left){
            dfs(root->left, get_word(root->left->val) + cur);
        }

        if (root->right) {
            dfs(root->right, get_word(root->right->val) + cur);
        }
    }

    string smallestFromLeaf(TreeNode* root) {
        if (!root) return "";

        // string 有一个构造函数的形式是：string(size_t n, char c);
        // 表示创建一个长度为 n 的字符串，内容由字符 c 重复 n 次组成。
        string cur(1, get_word(root->val));
        dfs(root, cur);

        sort(path.begin(), path.end());

        for (auto &x : path) {
            cout << x << endl;
        }
        return path[0];
    }
};